package bt.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import bt.excepcion.DAOExcepcion;
import bt.modelo.Cargo;
import bt.modelo.Moneda;
import bt.modelo.OportunidadLaboral;
import bt.modelo.Pais;
import bt.modelo.TipoContrato;
import bt.util.ConexionBD;

public class OportunidadLaboralDAO extends BaseDAO {
	
	public void insertar(OportunidadLaboral bt) throws DAOExcepcion {
		System.out.println("OportunidadLaboralDAO: insertar(OportunidadLaboral vo)");
		
		StringBuffer query = new StringBuffer("Insert into oportunidadlaboral ( descripcion, fechaVigencia, sueldo, idEmpresa");
		query.append(" ,idCargo, fechaRegistro, idMoneda, IdPais, IdDepartamento, idTipoContrato ) values  ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ); ");
		
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = (PreparedStatement) con.prepareStatement(query.toString());
			stmt.setString(1, bt.getDescripcion());
			stmt.setDate(2, bt.getFechaVigencia());
			stmt.setDouble(3, bt.getSueldo());
			stmt.setInt(4, bt.getIdEmpresa());
			stmt.setInt(5, bt.getIdCargo());
			stmt.setString(6, bt.getFechaRegistro());
			stmt.setInt(7, bt.getIdMoneda());
			stmt.setInt(8, bt.getIdPais());
			stmt.setInt(9, bt.getIdDepartamento());
			stmt.setInt(10, bt.getIdTipoContrato());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar en tabla de Oportunidad laboral.");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void actualizar(OportunidadLaboral bt) throws DAOExcepcion {
		System.out.println("OportunidadLaboralDAO: actualizar(OportunidadLaboral vo)");
		
		StringBuffer query = new StringBuffer("update oportunidadlaboral set descripcion=?, fechaVigencia=?, sueldo=?, ");
		query.append(" idCargo=?, fechaRegistro=?, idMoneda=?, IdPais=?, IdDepartamento=?, idTipoContrato=? where idoportunidadlaboral=? ");
		
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query.toString());
			
			stmt.setString(1, bt.getDescripcion());
			stmt.setDate(2, bt.getFechaVigencia());
			stmt.setDouble(3, bt.getSueldo());
			stmt.setInt(4, bt.getIdCargo());
			stmt.setString(5, bt.getFechaRegistro());
			stmt.setInt(6, bt.getIdMoneda());
			stmt.setInt(7, bt.getIdPais());
			stmt.setInt(8, bt.getIdDepartamento());
			stmt.setInt(9, bt.getIdTipoContrato());
			stmt.setInt(10, bt.getIdOportunidadLaboral());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar la Oportunidad Laboral.");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void eliminar(int idOportunidadLaboral) throws DAOExcepcion {
		System.out.println("OportunidadLaboralDAO: eliminar(int idOportunidadLaboral)");
		String query = "DELETE FROM OportunidadLaboral WHERE idOportunidadLaboral=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = (PreparedStatement) con.prepareStatement(query);
			stmt.setInt(1, idOportunidadLaboral);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar la Oportunidad laboral.");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt); 
			this.cerrarConexion(con);
		}
	}
	
	public OportunidadLaboral obtener(int idOportunidadLaboral) throws DAOExcepcion {
		System.out.println("OportunidadLaboralDAO: obtener(int idOportunidadLaboral)");
		OportunidadLaboral bt = new OportunidadLaboral();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {		
			StringBuffer query = new StringBuffer("select o.idempresa, e.razonsocial desempresa, o.idcargo, c.descripcion descargo, o.sueldo, o.fechavigencia, "); 
			query.append("o.descripcion, o.fecharegistro, o.idOportunidadLaboral, o.idMoneda, m.descripcion desMoneda, o.IdPais, ");
			query.append("p.nombre desPais, o.IdDepartamento, d.nombre desDepartamento, o.idTipoContrato, t.descripcion desTipoContrato "); 
			query.append("from oportunidadlaboral o, empresa e, cargo c, moneda m, pais p, departamento d, tipocontrato t where ");
			query.append("o.idmoneda = m.idmoneda and o.idpais = p.idpais and o.iddepartamento = d.iddepartamento and ");
			query.append(" o.idtipocontrato = t.idtipocontrato and o.idempresa = e.idempresa and o.idcargo = c.idcargo and o.idOportunidadLaboral=? ");
			
			con = ConexionBD.obtenerConexion();
			stmt = (PreparedStatement) con.prepareStatement(query.toString());
			stmt.setInt(1, idOportunidadLaboral);
			rs = stmt.executeQuery();
			if (rs.next()) {
				bt.setIdEmpresa(rs.getInt("idEmpresa"));
				bt.setDesEmpresa(rs.getString("desEmpresa"));
				bt.setIdCargo(rs.getInt("idCargo"));
				bt.setDesCargo(rs.getString("desCargo"));				
				bt.setSueldo(rs.getDouble("sueldo"));
				bt.setFechaVigencia(rs.getDate("fechavigencia"));
				bt.setDescripcion(rs.getString("descripcion"));
				bt.setFechaRegistro(rs.getString("fecharegistro"));
				bt.setIdMoneda(rs.getInt("idMoneda"));
				bt.setDesMoneda(rs.getString("desMoneda"));				
				bt.setIdPais(rs.getInt("IdPais"));
				bt.setDesPais(rs.getString("desPais"));
				bt.setIdDepartamento(rs.getInt("IdDepartamento"));
				bt.setDesDepartamento(rs.getString("desDepartamento"));
				bt.setIdTipoContrato(rs.getInt("idTipoContrato"));
				bt.setDesTipoContrato(rs.getString("desTipoContrato"));				
				bt.setIdOportunidadLaboral(rs.getInt("idOportunidadLaboral"));
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return bt;
	}

	public Collection<OportunidadLaboral> BuscarxCriterios(int idPais, int idDepartamento, int IdCargo, int IdTipoContrato, Date feInicio, Date feFin, String textoBusqueda ) throws DAOExcepcion {
		System.out.println("OportunidadLaboralDAO: BuscarxCriterios()");

		Collection<OportunidadLaboral> lista = new ArrayList<OportunidadLaboral>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			StringBuffer query = new StringBuffer("select o.idempresa, e.razonsocial desempresa, o.idcargo, c.descripcion descargo, o.sueldo, o.fechavigencia, "); 
			query.append("o.descripcion, o.fecharegistro, o.idOportunidadLaboral, o.idMoneda, m.descripcion desMoneda, o.IdPais, ");
			query.append("p.nombre desPais, o.IdDepartamento, d.nombre desDepartamento, o.idTipoContrato, t.descripcion desTipoContrato "); 
			query.append("from oportunidadlaboral o, empresa e, cargo c, moneda m, pais p, departamento d, tipocontrato t where ");
			query.append("o.idmoneda = m.idmoneda and o.idpais = p.idpais and o.iddepartamento = d.iddepartamento and ");
			query.append(" o.idtipocontrato = t.idtipocontrato and o.idempresa = e.idempresa and o.idcargo = c.idcargo ");
			
			if (idPais>0) {
				query.append(" and o.idpais =" + Integer.toString(idPais) + " " );
			}
			if (idDepartamento>0) {
				query.append(" and o.iddepartamento =" + Integer.toString(idDepartamento) + " " );
			}
			if (IdCargo>0) {
				query.append(" and o.idCargo =" + Integer.toString(IdCargo) );	
			}
			if (IdTipoContrato>0) {
				query.append(" and o.IdTipoContrato =" + Integer.toString(IdTipoContrato) + " " );	
			}
			if (feFin.toString()!="1900-01-01" && feFin!=null) {
				query.append(" and o.fechavigencia between '" + feInicio.toString() + "' and '" + feFin.toString() + "' ");	
			}
			if (!textoBusqueda.trim().isEmpty()) {
				query.append(" and o.descripcion like '%" + textoBusqueda.trim() + "%' ");	
			}

			query.append(" order by o.fecharegistro desc ");
			
			stmt = (PreparedStatement) con.prepareStatement(query.toString());
					
			rs = stmt.executeQuery();
			while (rs.next()) {
				OportunidadLaboral bt = new OportunidadLaboral();
				bt.setIdEmpresa(rs.getInt("idEmpresa"));
				bt.setDesEmpresa(rs.getString("desEmpresa"));
				bt.setIdCargo(rs.getInt("idCargo"));
				bt.setDesCargo(rs.getString("desCargo"));				
				bt.setSueldo(rs.getDouble("sueldo"));
				bt.setFechaVigencia(rs.getDate("fechavigencia"));
				bt.setDescripcion(rs.getString("descripcion"));
				bt.setFechaRegistro(rs.getString("fecharegistro"));
				bt.setIdMoneda(rs.getInt("idMoneda"));
				bt.setDesMoneda(rs.getString("desMoneda"));				
				bt.setIdPais(rs.getInt("IdPais"));
				bt.setDesPais(rs.getString("desPais"));
				bt.setIdDepartamento(rs.getInt("IdDepartamento"));
				bt.setDesDepartamento(rs.getString("desDepartamento"));
				bt.setIdTipoContrato(rs.getInt("idTipoContrato"));
				bt.setDesTipoContrato(rs.getString("desTipoContrato"));				
				bt.setIdOportunidadLaboral(rs.getInt("idOportunidadLaboral"));

				lista.add(bt);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

		System.out.println("registros " + lista.size());
		
		return lista;
	}
	
	public Collection<OportunidadLaboral> listarxCargo(int idCargo) throws DAOExcepcion {
		System.out.println("OportunidadLaboralDAO: listar()");
		Collection<OportunidadLaboral> lista = new ArrayList<OportunidadLaboral>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			StringBuffer query = new StringBuffer("select o.idempresa, e.razonsocial desempresa, o.idcargo, c.descripcion descargo, o.sueldo, o.fechavigencia, "); 
			query.append("o.descripcion, o.fecharegistro, o.idOportunidadLaboral, o.idMoneda, m.descripcion desMoneda, o.IdPais, ");
			query.append("p.nombre desPais, o.IdDepartamento, d.nombre desDepartamento, o.idTipoContrato, t.descripcion desTipoContrato "); 
			query.append("from oportunidadlaboral o, empresa e, cargo c, moneda m, pais p, departamento d, tipocontrato t where ");
			query.append("o.idmoneda = m.idmoneda and o.idpais = p.idpais and o.iddepartamento = d.iddepartamento and ");
			query.append(" o.idtipocontrato = t.idtipocontrato and o.idempresa = e.idempresa and o.idcargo = c.idcargo and o.idCargo=? ");
			stmt = (PreparedStatement) con.prepareStatement(query.toString());
			stmt.setInt(1, idCargo);
			rs = stmt.executeQuery();
			while (rs.next()) {
				OportunidadLaboral bt = new OportunidadLaboral();
				bt.setIdEmpresa(rs.getInt("idEmpresa"));
				bt.setDesEmpresa(rs.getString("desEmpresa"));
				bt.setIdCargo(rs.getInt("idCargo"));
				bt.setDesCargo(rs.getString("desCargo"));				
				bt.setSueldo(rs.getDouble("sueldo"));
				bt.setFechaVigencia(rs.getDate("fechavigencia"));
				bt.setDescripcion(rs.getString("descripcion"));
				bt.setFechaRegistro(rs.getString("fecharegistro"));
				bt.setIdMoneda(rs.getInt("idMoneda"));
				bt.setDesMoneda(rs.getString("desMoneda"));				
				bt.setIdPais(rs.getInt("IdPais"));
				bt.setDesPais(rs.getString("desPais"));
				bt.setIdDepartamento(rs.getInt("IdDepartamento"));
				bt.setDesDepartamento(rs.getString("desDepartamento"));
				bt.setIdTipoContrato(rs.getInt("idTipoContrato"));
				bt.setDesTipoContrato(rs.getString("desTipoContrato"));				
				bt.setIdOportunidadLaboral(rs.getInt("idOportunidadLaboral"));

				lista.add(bt);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public Collection<OportunidadLaboral> listarxEmpresa(int idEmpresa) throws DAOExcepcion {
		System.out.println("OportunidadLaboralDAO: listar()");
		Collection<OportunidadLaboral> lista = new ArrayList<OportunidadLaboral>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			StringBuffer query = new StringBuffer("select o.idempresa, e.razonsocial desempresa, o.idcargo, c.descripcion descargo, o.sueldo, o.fechavigencia, "); 
			query.append("o.descripcion, o.fecharegistro, o.idOportunidadLaboral, o.idMoneda, m.descripcion desMoneda, o.IdPais, ");
			query.append("p.nombre desPais, o.IdDepartamento, d.nombre desDepartamento, o.idTipoContrato, t.descripcion desTipoContrato "); 
			query.append("from oportunidadlaboral o, empresa e, cargo c, moneda m, pais p, departamento d, tipocontrato t where ");
			query.append("o.idmoneda = m.idmoneda and o.idpais = p.idpais and o.iddepartamento = d.iddepartamento and ");
			query.append(" o.idtipocontrato = t.idtipocontrato and o.idempresa = e.idempresa and o.idcargo = c.idcargo and o.idempresa=? ");
			
			stmt = (PreparedStatement) con.prepareStatement(query.toString());
			stmt.setInt(1, idEmpresa);
			rs = stmt.executeQuery();
			while (rs.next()) {
				OportunidadLaboral bt = new OportunidadLaboral();
				bt.setIdEmpresa(rs.getInt("idEmpresa"));
				bt.setDesEmpresa(rs.getString("desEmpresa"));
				bt.setIdCargo(rs.getInt("idCargo"));
				bt.setDesCargo(rs.getString("desCargo"));				
				bt.setSueldo(rs.getDouble("sueldo"));
				bt.setFechaVigencia(rs.getDate("fechavigencia"));
				bt.setDescripcion(rs.getString("descripcion"));
				bt.setFechaRegistro(rs.getString("fecharegistro"));
				bt.setIdMoneda(rs.getInt("idMoneda"));
				bt.setDesMoneda(rs.getString("desMoneda"));				
				bt.setIdPais(rs.getInt("IdPais"));
				bt.setDesPais(rs.getString("desPais"));
				bt.setIdDepartamento(rs.getInt("IdDepartamento"));
				bt.setDesDepartamento(rs.getString("desDepartamento"));
				bt.setIdTipoContrato(rs.getInt("idTipoContrato"));
				bt.setDesTipoContrato(rs.getString("desTipoContrato"));				
				bt.setIdOportunidadLaboral(rs.getInt("idOportunidadLaboral"));

				lista.add(bt);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public Collection<Moneda> listarMoneda() throws DAOExcepcion {
		Collection<Moneda> lista = new ArrayList<Moneda>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT idmoneda,descripcion FROM moneda";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {

				Moneda bt = new Moneda();
				bt.setIdMoneda(rs.getInt("idmoneda"));
				bt.setDescripcion(rs.getString("descripcion"));

				lista.add(bt);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public Collection<Cargo> listarCargo() throws DAOExcepcion {
		Collection<Cargo> lista = new ArrayList<Cargo>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT idcargo,descripcion FROM cargo";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {

				Cargo bt = new Cargo();
				bt.setIdCargo(rs.getInt("idcargo"));
				bt.setDescripcion(rs.getString("descripcion"));

				lista.add(bt);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public Collection<TipoContrato> listarTipoContrato() throws DAOExcepcion {
		Collection<TipoContrato> lista = new ArrayList<TipoContrato>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT idtipocontrato,descripcion FROM TipoContrato";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {

				TipoContrato bt = new TipoContrato();
				bt.setIdTipoContrato(rs.getInt("idTipoContrato"));
				bt.setDescripcion(rs.getString("descripcion"));

				lista.add(bt);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

}
